﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
//class Date
//{
//public:
//	Date(int year, int month, int day)
//		: _year(year)
//		, _month(month)
//		, _day(day)
//	{}
//	// d1 << cout; -> d1.operator<<(&d1, cout); 不符合常规调用
//	// 因为成员函数第一个参数一定是隐藏的this，所以d1必须放在<<的左侧
//	ostream& operator<<(ostream& _cout)
//	{
//		_cout << _year << "-" << _month << "-" << _day << endl;
//		return _cout;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	Date d1(2023, 5, 13);
//	d1 << cout;// 因为成员函数第一个参数一定是隐藏的this，所以d1必须放在<<的左侧
//	//这是因为 << 运算符被重载为 Date 类的成员函数，而不是全局函数。
//	// 在重载运算符时，左侧操作数（即调用该运算符的对象）
//	// 必须作为其成员函数的隐式参数出现。因此，在这种情况下，d1 必须放在 << 的左侧。
////如果将 << 运算符定义为全局函数，则可以使用 cout << d1; 
//	//这样的写法，因为此时该运算符不属于任何类。
//	return 0;
//}

//友元函数可以直接访问类的私有成员，它是定义在类外部的普通函数，
//不属于任何类，但需要在类的内部声
//明，声明时需要加friend关键字。

//class Date
//{
//	friend ostream& operator<<(ostream& _cout, const Date& d);
//	friend istream& operator>>(istream& _cin,  Date& d);
//
//public:
//	Date(int year, int month, int day)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//ostream& operator<<(ostream& _cout, const Date& d)
//{
//	_cout << d._year << "年" << d._month << "月" << d._day << "日" << endl;
//	return _cout;
//}
//istream& operator>>(istream& _cin, Date& d)
//{
//	_cin >> d._year;
//	_cin >> d._month;
//	_cin >> d._day;
//	return _cin;
//}
//
//int main()
//{
//	Date d1(2023, 12, 12);
//	cin >> d1;
//	cout << d1;
//	return 0;
//}

//友元类

class TimeOfDate
{
	friend class Date;
public:
	TimeOfDate(int hours=12, int minue=35, int second=56)
	{
		_hours = hours;
		_minue = minue;
		_second = second;
	}
	
private:
	int _hours;
	int _minue;
	int _second;
};

class Date
{
public:
	Date(int year = 2023, int month = 1, int day = 15)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	/*void SetTime(int hour, int minue, int second)
	{
		_t._hours = hour;
		_t._minue = minue;
		_t.second = second;
	}*/
	void SetTime(int hour, int minue, int second)
	{
		_t._hours = hour;
		_t._minue = minue;
		_t._second = second;
	}

	void PrintTime()
	{
		cout << _year << "年" << _month << "月" << _day << "日" << _t._hours <<":" << _t._minue << ":"
			<< _t._second << endl;
	}
private:
	int _year;
	int _month;
	int _day;
	TimeOfDate _t;//在 Date 类的 private 成员中加入 
	//TimeOfDate _t 是为了将时间和日期数据组合成一个完整的日期时间对象。
	//这种设计方式可以方便地对日期和时间进行操作，同时代码结构也更清晰易懂。
};


int main()
{
	Date d1(2023, 5, 13);
	d1.SetTime(10, 40, 41);
	d1.PrintTime();
	return 0;
}


//下面程序段包含4个函数, 其中具有隐含this指针的是()
﻿int f1();
class T
{
public:
	static int f2();

private:
	friend int f3();
protect:
	int f4();

};